﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using DataTier.Repository;
using System.ServiceModel;
using DataTier.Entities;
using DataTier;
using Common;

namespace Otgruzka.ServicesClients
{
    public class ProductsClient
    {

        public readonly ProductsRepository Repository = null;

        public ProductsClient()
        {
            this.Repository = new ProductsRepository();
        }


        /// <summary>
        /// Возвращает полный текст Exceptions вместе с вложенными Exceptions
        /// </summary>
        /// <param name="ex"></param>
        /// <returns></returns>
        public string GetExceptionDetail(System.ServiceModel.FaultException<ExceptionDetail> ex)
        {
            string message = ex.Message;

            var ie = ex.InnerException;
            while (ie != null)
            {
                message += string.Format("<br />{0}", ie.Message);
                ie = ie.InnerException;
            }

            var ed = ex.Detail;
            do
            {
                message += string.Format("<br />{0}", ed.Message);
                ed = ed.InnerException;
            } while (ed != null);
            return message;
        }


        /// <summary>
        /// Возвращает список Товаров
        /// </summary>
        /// <returns></returns>
        public List<ProductEntity> GetProductList(int currentUserId, int numPage, int onPage, SearchParameters parameters = null, string sortColumn = null, string sortDirection = null)
        {
            try
            {
                var products = Repository.GetProductList(currentUserId, numPage, onPage, parameters, sortColumn, sortDirection);
                return products;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список продуктов из базы данных.");
            }
        }


        /// <summary>
        /// Возвращает количество Продуктов из базы данных
        /// </summary>
        /// <returns></returns>
        public int GetProductListCount(int currentUserId, SearchParameters parameters = null)
        {
            try
            {
                return this.Repository.GetProductListCount(currentUserId, parameters);
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                return 0;
            }
        }


        /// <summary>
        /// Возвращает список Товаров без тех, у которых установлен признак СКРЫТ
        /// </summary>
        /// <returns></returns>
        public List<ProductEntity> GetNotHiddenProductList(int currentUserId)
        {
            try
            {
                var products = Repository.GetNotHiddenProductList(currentUserId);
                return products;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список продуктов из базы данных.");
            }
        }


        /// <summary>
        /// Добавляет новый продукт
        /// </summary>
        /// <param name="product"></param>
        /// <returns></returns>
        public int SaveProduct(int currentUserId, ProductEntity product)
        {
            try
            {
                int id = Repository.SaveProduct(currentUserId, product);
                return id;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке сохранить продукт в базу данных.");
            }
        }


        /// <summary>
        /// Обновляет картинку с изображением продукта
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="productId"></param>
        /// <param name="ImageBigUrl"></param>
        /// <param name="ImageSmallUrl"></param>
        public void UpdateImageProduct(int currentUserId, int productId, string ImageBigUrl, string ImageSmallUrl)
        {
            try
            {
                Repository.UpdateImageProduct(currentUserId, productId, ImageBigUrl, ImageSmallUrl);
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке обновить продукт в базе данных.");
            }
        }


        /// <summary>
        /// Удаление Продукта из базы данных
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="productId"></param>
        public void DeleteProduct(int currentUserId, int productId)
        {
            try
            {
                Repository.DeleteProduct(currentUserId, productId);
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке удалить продукт из базы данных.");
                //throw new FaultException<Exception>(new Exception(ex.Message, ex), "Произошла ошибка при попытке удалить запись из базы данных.");
                //throw new Exception("Произошла ошибка при попытке удалить запись из базы данных.", ex);
                //throw new FaultException<WCFExceptionDetails>(new WCFExceptionDetails("Ошибка сохранения", ex), "Произошла ошибка при попытке удалить запись из базы данных.");
            }
        }


        /// <summary>
        /// Скрытие продукта (установка признака СКРЫТ)
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="productId"></param>
        /// <param name="isHidden"></param>
        public void SetIsHidden(int currentUserId, int productId, bool isHidden)
        {
            try
            {
                Repository.SetIsHidden(currentUserId, productId, isHidden);
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке обновить продукт в базе данных.");
            }
        }


        /// <summary>
        /// Возвращает список единиц измерения Товаров
        /// </summary>
        /// <returns></returns>
        public List<MeasureUnit> GetMeasureUnitList(int currentUserId)
        {
            try
            {
                var units = Repository.GetMeasureUnitList(currentUserId);
                return units;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список единиц измерения продуктов из базы данных.");
            }
        }


        /// <summary>
        /// Возвращает единицу измерения Товара по ID
        /// </summary>
        /// <returns></returns>
        public MeasureUnit GetMeasureUnitById(int currentUserId, int measureUnitId)
        {
            try
            {
                var unit = Repository.GetMeasureUnitById(currentUserId, measureUnitId);
                return unit;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить данные о единице измерения продукта из базы данных.");
            }
        }


    }
}